Messenger বা Mediator Pattern একটি Behavioral Design Pattern যা objects বা components এর মধ্যে সরাসরি যোগাযোগের পরিবর্তে একটি মধ্যস্থতাকারী (Mediator) ব্যবহার করে তাদের মধ্যে যোগাযোগ প্রতিষ্ঠা করে। এর মাধ্যমে, একাধিক অবজেক্টের মধ্যে যোগাযোগের জন্য একটি একক কম্পোনেন্টের মাধ্যমে বার্তা প্রেরণ করা হয়, যাতে কমপ্লেক্সিটি কমে এবং কোডের ডিপেনডেন্সি সহজ হয়।
Mediator Pattern ব্যবহৃত হয় যখন একাধিক অবজেক্ট একে অপরের সাথে সরাসরি যোগাযোগ করে, যা কোডের অপ্রত্যাশিত জটিলতা সৃষ্টি করে, এবং এটি একটি মধ্যস্থতাকারী অবজেক্টের মাধ্যমে যোগাযোগকে সহজ করে তোলে।
এটি বিশেষত UI Components বা ViewModel এবং Model এর মধ্যে যোগাযোগে কাজে আসে যেখানে ViewModel এর কম্পোনেন্টগুলি একে অপরের সাথে সরাসরি যোগাযোগ না করে, বরং একটি Mediator বা Messenger অবজেক্টের মাধ্যমে বার্তা আদান-প্রদান করে।
Mediator Pattern এর মূল উদ্দেশ্য হলো কোডের জটিলতা কমানো এবং নির্দিষ্ট কম্পোনেন্টগুলোর মধ্যে সরাসরি যোগাযোগ এড়ানো। যখন একাধিক কম্পোনেন্ট বা ক্লাসের মধ্যে যোগাযোগ খুব বেশি জটিল হয়ে যায়, তখন এই প্যাটার্ন ব্যবহার করা হয়। এর মাধ্যমে, সমস্ত কম্পোনেন্টকে একটি একক কেন্দ্রীক স্থানে, অর্থাৎ Mediator-এ বার্তা পাঠানোর জন্য নির্দিষ্ট করা হয়।
Mediator বা Messenger অ্যাপ্লিকেশন আর্কিটেকচারে সাহায্য করে:
Mediator Pattern তে তিনটি প্রধান উপাদান থাকে:
ধরা যাক, একটি Chat Application আছে যেখানে কয়েকজন ব্যবহারকারী বিভিন্ন কক্ষে (rooms) বার্তা পাঠাচ্ছে। এখানে, ব্যবহারকারীদের মধ্যে সরাসরি বার্তা পাঠানোর পরিবর্তে, Messenger বা Mediator প্যাটার্ন ব্যবহার করা হবে।
public interface IMediator
{
void SendMessage(string message, IColleague colleague);
}
public interface IColleague
{
void ReceiveMessage(string message);
void SetMediator(IMediator mediator);
}
public class ChatRoomMediator : IMediator
{
private List<IColleague> colleagues;
public ChatRoomMediator()
{
colleagues = new List<IColleague>();
}
public void AddColleague(IColleague colleague)
{
colleagues.Add(colleague);
colleague.SetMediator(this);
}
public void SendMessage(string message, IColleague colleague)
{
foreach (var c in colleagues)
{
// বার্তা পাঠানোর জন্য, তবে পাঠানো কম্পোনেন্ট নিজে সেই বার্তা পাবে না
if (c != colleague)
{
c.ReceiveMessage(message);
}
}
}
}
public class User : IColleague
{
public string Name { get; private set; }
private IMediator mediator;
public User(string name)
{
Name = name;
}
public void SetMediator(IMediator mediator)
{
this.mediator = mediator;
}
public void SendMessage(string message)
{
Console.WriteLine($"{Name} sends: {message}");
mediator.SendMessage(message, this);
}
public void ReceiveMessage(string message)
{
Console.WriteLine($"{Name} receives: {message}");
}
}
class Program
{
static void Main()
{
ChatRoomMediator mediator = new ChatRoomMediator();
IColleague user1 = new User("John");
IColleague user2 = new User("Jane");
mediator.AddColleague(user1);
mediator.AddColleague(user2);
user1.SendMessage("Hello, how are you?");
user2.SendMessage("I'm good, thank you!");
}
}
John sends: Hello, how are you?
Jane receives: Hello, how are you?
Jane sends: I'm good, thank you!
John receives: I'm good, thank you!
এখানে, John এবং Jane সরাসরি একে অপরকে বার্তা পাঠাচ্ছে না, বরং ChatRoomMediator এর মাধ্যমে বার্তাগুলি প্রেরিত হচ্ছে।
MVVM প্যাটার্নে, Messenger Pattern বা Mediator Pattern একটি গুরুত্বপূর্ণ ভূমিকা পালন করতে পারে, বিশেষত ViewModel গুলির মধ্যে যোগাযোগ প্রতিষ্ঠার জন্য। যখন একাধিক ViewModel একে অপরের সাথে যোগাযোগ করতে চায়, কিন্তু তাদের মধ্যে সরাসরি সম্পর্ক রাখা উচিত নয়, তখন একটি Messenger ক্লাস ব্যবহার করা হয় যা বার্তা পাঠায়।
public class Messenger
{
private static Dictionary<string, Action<string>> _recipients = new Dictionary<string, Action<string>>();
public static void Register(string recipient, Action<string> callback)
{
_recipients[recipient] = callback;
}
public static void Send(string recipient, string message)
{
if (_recipients.ContainsKey(recipient))
{
_recipients[recipient](message);
}
}
}
এখানে, Messenger একটি স্ট্যাটিক ক্লাস যা বার্তা পাঠানোর এবং গ্রহণের কাজটি পরিচালনা করে।
public class SenderViewModel
{
public void SendMessage()
{
Messenger.Send("Receiver", "Hello from Sender!");
}
}
public class ReceiverViewModel
{
public ReceiverViewModel()
{
Messenger.Register("Receiver", ReceiveMessage);
}
private void ReceiveMessage(string message)
{
Console.WriteLine($"Receiver received: {message}");
}
}
এখানে SenderViewModel বার্তা প্রেরণ করবে এবং ReceiverViewModel সেই বার্তা গ্রহণ করবে। Messenger প্যাটার্ন ViewModel গুলির মধ্যে সরাসরি যোগাযোগ ছাড়াই বার্তা প্রেরণ ও গ্রহণ করে।
Mediator বা Messenger Pattern একটি অত্যন্ত কার্যকর ডিজাইন প্যাটার্ন যা MVVM বা অন্যান্য আর্কিটেকচারে ব্যবহার করা হয় যখন একাধিক কম্পোনেন্টের মধ্যে যোগাযোগ হতে হয় তবে তাদের সরাসরি সম্পর্ক রাখা উচিত নয়। এটি কোডের জটিলতা কমায় এবং ব্যবস্থাপনা সহজ করে।
common.read_more